package ReflectStudy.Exa12.dymProxy;

import ReflectStudy.Exa12.noProxy.Seller;
import ReflectStudy.Exa8.MethodTest;
import sun.misc.ProxyGenerator;

import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {
        Seller seller ;
        System.out.println("使用代理方式：");
        // 获得Seller类的类加载器
        ClassLoader loader = Seller.class.getClassLoader();
        //动态生成代理类
        seller = (Seller) Proxy.newProxyInstance(loader, new Class[] { Seller.class }, new Agency());
        // 代理方式调用sell()方法
        seller.sell();
        seller.sayHello();

        //generateClassFile(seller.getClass(), "SellerProxy");
    }

    /**
     * 将根据类信息动态生成的二进制字节码保存到硬盘中，默认的是clazz目录下
     * params: clazz 需要生成动态代理类的类
     * proxyName: 为动态生成的代理类的名称
     */
    public static void generateClassFile(Class<?> clazz, String proxyName) {
        // 根据类信息和提供的代理类名称，生成字节码
        byte[] classFile = ProxyGenerator.generateProxyClass(proxyName, clazz.getInterfaces());
       // String paths = clazz.getResource(".").getPath();
       // System.out.println(paths);
        FileOutputStream out = null;
        try {
            //保留到硬盘中
            out = new FileOutputStream( proxyName + ".class");
            out.write(classFile);
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}
